#include <string.h>
#include <stdio.h>
#include "osal_mem.h"
#include "osal_time.h"
#include "gpio_if.h"

#define GPIO_A(num) (0 + num)
#define GPIO_B(num) (32 + num)
#define GPIO_C(num) (64 + num)
#define GPIO_D(num) (96 + num)
#define GPIO_E(num) (128 + num)
#define GPIO_F(num) (160 + num)
#define GPIO_G(num) (192 + num)
#define GPIO_H(num) (224 + num)
#define GPIO_I(num) (256 + num)


#define Positive_Edge 0x0
#define Negative_Edge 0x1
#define High_Level 0x2
#define Low_Level 0x3
#define Double_Edge 0x04
static uint32_t g_irqCnt;

/* 中断服务函数*/
static int32_t TestCaseGpioIrqHandler(uint16_t gpio, void *data)
{
    GpioDisableIrq(gpio);
    printf("%s: *******************irq triggered! on exitnum:%u, data=%p\n", __func__, gpio, data);
    return GpioEnableIrq(gpio);
}
/**
 * 使用PI17进行中断测试，需要外部提供电平变化
 */
int main(void)
{
    int32_t ret;
    int16_t val;    
    GpioSetDir(GPIO_H(14), 6);
    GpioDisableIrq(GPIO_H(14));
    ret = GpioSetIrq(GPIO_H(14), Positive_Edge, TestCaseGpioIrqHandler, (void*)&ret);
    if(ret != 0){
        printf("GpioSetIrq ret: %d \n", ret);
    }
    GpioEnableIrq(GPIO_H(14));

    GpioSetDir(GPIO_H(15), 6);
    GpioDisableIrq(GPIO_H(15));
    ret = GpioSetIrq(GPIO_H(15), Positive_Edge, TestCaseGpioIrqHandler, (void*)&ret);
    if(ret != 0){
        printf("GpioSetIrq ret: %d \n", ret);
    }
    GpioEnableIrq(GPIO_H(15));
    
    printf("wait int, Enter enter to exit\n");
    getchar();
    (void)GpioRead(GPIO_H(14), &val);
    printf("PI17:%d \n",  val);
    getchar();
    (void)GpioRead(GPIO_H(14), &val);
    printf("PI17:%d \n",  val);
    getchar();
    (void)GpioRead(GPIO_H(14), &val);
    printf("PI17:%d \n",  val);
    GpioDisableIrq(GPIO_H(14));
    GpioUnsetIrq(GPIO_H(14), NULL);
    GpioDisableIrq(GPIO_H(15));
    GpioUnsetIrq(GPIO_H(15), NULL);
    return 0;
}